package com.bawei.lib_net.test_rertrofit

import okhttp3.Call
import okhttp3.Callback
import okhttp3.OkHttp
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import java.io.IOException
import java.util.concurrent.TimeUnit

/**
    1.retrofit：是基于Okhttp的restful风格网络框架
    2.api接口添加注解GET或POST请求
    （1）GET请求 @Query设置参数，拼接在链接后面？xx=xxx&xx=xxx
    （2）POST请求 普通表单提交 @Field注解,请求体，xx=xxx
    （3）POST请求 提交的json数据 @Body注解，请求体 {“xx”:”xxx”}
    （4）POST请求 上传文件 @Body MultipartBody.Part类型 而且方法上添加 @Multipart
    3.查看retrofit的create方法的源码中采用动态代理和反射技术解析api接口中方法的注解注解和信息参数构建一个Http请求对象
    4.retrofit会将请求对象发给Okhttp库执行请求，返回Call对象
    5.Call对象我们可以进行解析转成我们自己需要的类型
    （1）mvp项目中结合Rxjava完成线程切换：RxJava2CallAdapterFactory()：依赖里有的，不需要自己封装
     (2)mvvm项目中结合LiveData，自己封装LiveDataCallAdapterFactory()：将Call转成LiveData
    （3）kotlin项目：mvvm/mvi项目结合协程和Flow流完成网络请求:suspend函数

 */
class RetrofitDemo {
    fun retrofit(){
        val okHttpClient = OkHttpClient.Builder()
            .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
            .connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)
            .build()

        val retrofit = Retrofit.Builder()
            .baseUrl("")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .client(okHttpClient)
            .build()

        val api = retrofit.create(Api::class.java)

        api.get(1)


    }


}